package Calculator;

import java.awt.event.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.util.Stack;

public class Calculator {
	public static void main(String[] args) {

		new MyCalculator();
	}
}



class MyCalculator extends Frame{
	Button num0;
	Button num1;
	Button num2;
	Button num3;
	Button num4;
	Button num5;
	Button num6;
	Button num7;
	Button num8;
	Button num9;
	
	Button button_sum;
	Button button_jian;
	Button button_dyu;
	Button panel4_button_mc;
	Button panel4_button_mr;
	Button panel4_button_ms;
	Button panel4_button_mjian;
	Button panel4_button_mjia;
	Button panel4_button1;
	Button panel4_button2;
	Button panel4_button3;
//	Button panel4_button4;
//	Button panel4_button5;
	Button button_che;
	Button button_chu;

	Panel panel1;
	Panel panel1_panel1;
	Panel panel2;
	Panel panel4;
	Panel panel5;
	Panel panelp1;
	Panel panelp2;
	Panel panelp3;
	Panel panelp4;
	Panel panelp5;

	Button num_fu1;      // "("
	Button num_fu2;       // ")"
//	Button num_fu3;
//	Button num_fu4;
	// 下面三个额外 的操作不添加了哦，被数字 Button 位置给占了
//	Button num00;
//	Button num_fu5 ;
//	Button num_fu6;
	Button num000;


	TextField textField_shang;
	TextField textField_xia;


	// 初始化函数
	public MyCalculator() {
		setBounds(100, 100, 400, 550);
		setVisible(true);
		this.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});

		setLayout(new GridLayout(4, 5));
		this.setResizable(false);
		
		/////////////////////////////////
		
		
		///////////////////////////////////
		panel1 = new Panel();
		panel1.setLayout(new GridLayout(3, 1));
		panel1_panel1 = new Panel();
		panel1_panel1.setLayout(new FlowLayout());

		// 最上一行 label1 设置一个鼠标点击监听事件，关闭基本计算器，打开 new MySpecialCalculator()
		Label label1 = new Label("Special");
		label1.setBackground(Color.lightGray);
		panel1_panel1.add(label1, new FlowLayout(FlowLayout.LEFT));
		label1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
//				super.mouseClicked(e);
//				System.out.println(111);

				setVisible(false);
				new MySpecialCalculator();
			}
		});

		// "MoreCalculatorInformation" and "MoreMathInformation"
		Label label2 = new Label("MoreInfo");
		label2.setBackground(Color.lightGray);
		panel1_panel1.add(label2, new FlowLayout(FlowLayout.CENTER));
		label2.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
//				super.mouseClicked(e);
//				System.out.println(111);

				setVisible(false);

				// 设置不了，外面直接开一个新的 class，这里直接 new 它就可以了哦
				new MyMoreInfo_panel();

//				Panel panel = new Panel();
//				panel.setLayout(new FlowLayout());
//				panel.setBounds(100,100,300,400);
//
//				TextField textField = new TextField();
//				textField.setText("这个基本计算器创建的时间在 java 课设第 12 周，2022.11.18 小项目答辩");
//
//				panel.add(textField);
//
//				add(panel);
			}
		});

		// Setting
		Label label3 = new Label("Setting");
		label3.setBackground(Color.lightGray);
		panel1_panel1.add(label3, new FlowLayout(FlowLayout.RIGHT));




		panel1.add(panel1_panel1);


		textField_shang = new TextField();
		textField_shang.setSize(300, 10);
		textField_xia = new TextField();
		textField_xia.setSize(300,10);
		textField_shang.addActionListener(new MyActionListener());
		textField_xia.addActionListener(new MyActionListener());

		panel1.add(textField_shang);
		panel1.add(textField_xia);

		add(panel1);
		
		
		////////////////// /////////////////////////
		panel4 = new Panel();
		panel4.setLayout(new GridLayout(2, 1));
		Panel panel_1 = new Panel();
		panel_1.setLayout(new GridLayout(1, 5));
		Panel panel_2 = new Panel();
		panel_2.setLayout(new GridLayout(1, 3));
		panel4_button_mc = new Button("MC");
		panel4_button_mr = new Button("MR");
		panel4_button_ms = new Button("MS");
		panel4_button_mjian = new Button("M+");
		panel4_button_mjia = new Button("M-");
		panel4_button1 = new Button("<==");
		panel4_button2 = new Button("CE");
		panel4_button3 = new Button("C");
//		panel4_button4 = new Button("+");      // 正数前面的 + 号
//		panel4_button5 = new Button("-");      // 负数前面的 - 号

		panel_1.add(panel4_button_mc);
		panel_1.add(panel4_button_mr);
		panel_1.add(panel4_button_ms);
		panel_1.add(panel4_button_mjian);
		panel_1.add(panel4_button_mjia);
		panel_2.add(panel4_button1);
		panel_2.add(panel4_button2);
		panel_2.add(panel4_button3);
//		panel4.add(panel4_button4);
//		panel4.add(panel4_button5);

		panel4.add(panel_1);
		panel4.add(panel_2);
		
		add(panel4);
		
		
		/////////////////////////////////////
		panel2 = new Panel();
		panel2.setLayout(new GridLayout(2, 5));
		num0 = new Button("0");
		num1 = new Button("1");
		num2 = new Button("2");
		num3 = new Button("3");
		num4 = new Button("4");
		num5 = new Button("5");
		num6 = new Button("6");
		num7 = new Button("7");
		num8 = new Button("8");
		num9 = new Button("9");
		button_sum = new Button("+");
		button_jian = new Button("-");
		button_dyu = new Button("==");

		
		panel2.add(num7);
		panel2.add(num8);
		panel2.add(num9);
		panel2.add(button_sum);
		panel2.add(button_jian);
		panel2.add(num4);
		panel2.add(num5);
		panel2.add(num6);
		button_che = new Button("x");
		panel2.add(button_che);
		button_chu = new Button("/");
		panel2.add(button_chu);

//		MyActionListener myActionListener = new MyActionListener();
//		num7.addActionListener(myActionListener);
//		num0.addActionListener(myActionListener);


		add(panel2);
		
		////////////////////////
		panel5 = new Panel();
		panel5.setLayout(new GridLayout(1, 5));

		num_fu1 = new Button("(");
		num_fu2 = new Button(")");
		num0 = new Button("0");
//		num_fu3 = new Button(".");         // 功能不实现
//		num_fu4 = new Button("1/x");       // 功能吧实现
		num000 = new Button("Pi");          // 功能不实现


		// 最后两行重新布局
//		panel5.setLayout(new GridLayout(1, 5));

		panelp1 = new Panel();
		panelp1.setLayout(new GridLayout(2, 1));
		panelp1.add(num1);
		panelp1.add(num_fu1);

		panelp2 = new Panel();
		panelp2.setLayout(new GridLayout(2, 1));
		panelp2.add(num2);
		panelp2.add(num0);

		panelp3 = new Panel();
		panelp3.setLayout(new GridLayout(2, 1));
		panelp3.add(num3);
		panelp3.add(num_fu2);

		panelp4 = new Panel();
		panelp4.setLayout(new GridLayout(1, 1));
		panelp4.add(num000);

		panelp5 = new Panel();
		panelp5.setLayout(new GridLayout(1, 1));
		panelp5.add(button_dyu);

//		panel5.add(num1);
//		panel5.add(num2);
//		panel5.add(num3);
//		panel5.add(num_fu3);
//		panel5.add(num_fu4);
//		panel5.add(num_fu1);
//		panel5.add(num0);
//		panel5.add(num_fu2);

		panel5.add(panelp1);
		panel5.add(panelp2);
		panel5.add(panelp3);

		panel5.add(panelp4);
		panel5.add(panelp5);
		
		add(panel5);




		MyActionListener myActionListener = new MyActionListener();
		num0.addActionListener(myActionListener);
		num1.addActionListener(myActionListener);
		num2.addActionListener(myActionListener);
		num3.addActionListener(myActionListener);
		num4.addActionListener(myActionListener);
		num5.addActionListener(myActionListener);
		num6.addActionListener(myActionListener);
		num7.addActionListener(myActionListener);
		num8.addActionListener(myActionListener);
		num9.addActionListener(myActionListener);
		panel4_button_mc.addActionListener(myActionListener);     // "MC"
		panel4_button_mr.addActionListener(myActionListener);     // "MR"
		panel4_button_ms.addActionListener(myActionListener);     // "MS"
		panel4_button_mjian.addActionListener(myActionListener);     // "M+"
		panel4_button_mjia.addActionListener(myActionListener);     // "M-"
		button_sum.addActionListener(myActionListener);       // "+"
		button_jian.addActionListener(myActionListener);      // "-"
		button_che.addActionListener(myActionListener);       // "x"
		button_chu.addActionListener(myActionListener);       // "/"
		button_dyu.addActionListener(myActionListener);       // ”==“
		panel4_button1.addActionListener(myActionListener);    // "<=="
		panel4_button2.addActionListener(myActionListener);     // 清空下面的输出框   ”CE“
		panel4_button3.addActionListener(myActionListener);     // 清空上面的输入框    "C"

//		panel4_button4.addActionListener(myActionListener);     // "+"
//		panel4_button5.addActionListener(myActionListener);     // "-"

//		num_fu3.addActionListener(myActionListener);           // "."
//		num_fu4.addActionListener(myActionListener);           // "1/x"
		num_fu1.addActionListener(myActionListener);           // "("
		num_fu2.addActionListener(myActionListener);           // ")"
		num000.addActionListener(myActionListener);            // ”Pi“

		// 基本计算器不实现   。    &
		// 超级计算器实现   。   &   <<   >>  toString   mod  o/o

	}

//	class MyActionListener_textField implements TextEvent {
//		public void textValueChanged(TextEvent e) {
//			textField_shang.setText("");
//		}
//	}


//	String stringBuffer = "";
	StringBuffer stringBuffer = new StringBuffer();
	// 记录曾经计算过的字符串表达式，用一个面板弹出来，可以关闭
//	StringBuffer[] stringBuffers = new StringBuffer[100];    // 只能计算 100 次，超过就 System.exit(0);
	String[] stringBuffers = new String[100];    // textField_xia.getText() 为 String 类型的哦
	// 记录曾经计算过的字符串表达式的结果，用一个面板弹出来，可以关闭
//	StringBuffer[] stringBuffers_ans = new StringBuffer[100];   // 与上面对应也是 100 个记录空间
	Double[] double_ans = new Double[100];
	// 记录上面两个数组的大小（用过多少个空间 len）
	int len = 0;

	//
	// 类中类（实现监听器），直接可以直接拿到上面的按钮上面的东西
	class MyActionListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
//			int nums = Integer.parseInt(num7.getLabel());
//			Button num_7 = (Button) e.getSource();
//
//			int num = Integer.parseInt(textField_shang.getText());
//			String str = num_7.getLabel();
//			System.out.println(str);


			if (e.getActionCommand().equals("0"))
				stringBuffer.append("0");
			if (e.getActionCommand().equals("1"))
				stringBuffer.append("1");
			if (e.getActionCommand().equals("2"))
				stringBuffer.append("2");
			if (e.getActionCommand().equals("3"))
				stringBuffer.append("3");
			if (e.getActionCommand().equals("4"))
				stringBuffer.append("4");
			if (e.getActionCommand().equals("5"))
				stringBuffer.append("5");
			if (e.getActionCommand().equals("6"))
				stringBuffer.append("6");
			if (e.getActionCommand().equals("7"))
				stringBuffer.append("7");
			if (e.getActionCommand().equals("8"))
				stringBuffer.append("8");
			if (e.getActionCommand().equals("9"))
				stringBuffer.append("9");
			if (e.getActionCommand().equals("+"))
				stringBuffer.append('+');
			if (e.getActionCommand().equals("-"))
				stringBuffer.append('-');
			if (e.getActionCommand().equals("x"))
				stringBuffer.append('x');
			if (e.getActionCommand().equals("/"))
				stringBuffer.append('/');
			if(e.getActionCommand().equals("("))
				stringBuffer.append('(');
			if(e.getActionCommand().equals(")"))
				stringBuffer.append(')');
			if(e.getActionCommand().equals("Pi"))     // 这里的 Pi 就约等于 3 了
				stringBuffer.append("3");
//			if(e.getActionCommand().equals("."))     // 基本计算器里面不实现
//				stringBuffer.append(".");
//			if(e.getActionCommand().equals("1/x")){      // 功能不实现
////				 判断 StringBuffer stringBuffer 字符串是否为空
//				if(stringBuffer.length() == 0){
//					num_fu4.setBackground(Color.red);
//					// 调用不了 textField_shang 输入框
////					textField_xia.setText("");
////					textField_xia.setText("" + "错误输入 5 秒后关闭窗口");
//					JOptionPane pane = new JOptionPane(JOptionPane.INFORMATION_MESSAGE);
//					JDialog dialog = pane.createDialog(null, "该对话框将在5秒后自动关闭");
//					dialog.setModal(false);
//					dialog.setVisible(true);
//
//					new TimedExit();
////					System.exit(0);
//				}
//				// 判断 stringBuffer 是否有非法字符，我们只需要 stringBuffer 是一个只有数字的连续字符串
//				for(int i = 0; i < stringBuffer.length(); i++)
//					if(stringBuffer.charAt(i) < '0' || stringBuffer.charAt(i) > '9'){
//						num_fu4.setBackground(Color.red);
//						JOptionPane pane = new JOptionPane(JOptionPane.INFORMATION_MESSAGE);
//						JDialog dialog = pane.createDialog(null, "该对话框将在5秒后自动关闭");
//						dialog.setModal(false);
//						dialog.setVisible(true);
//						// 调用不了输入框
////						textField_xia.setText("");
////						textField_xia.setText("" + "错误输入 3 秒后关闭窗口");
//
//						new TimedExit();
////						System.exit(10);   // 作用和 System,exit(0) 一样
//					}
//
//				// 正确输入的情况
//				double ans = 0;
//				int j = 0;
//				while (j < stringBuffer.length() && stringBuffer.charAt(j) <= '9' && stringBuffer.charAt(j) >= '0'){
//					ans = ans * 10 + (stringBuffer.charAt(j) - '0');
//					j++;
//				}
//
//				ans = 1 / ans;
//				textField_xia.setText("" + ans);
//			}
			if(e.getActionCommand().equals("<==")){
				// 点一次就输出 stringBuffer 最后一个字符
				// stringBuffer 字符串为空的情况就不用 deleteCharAt 了哦
				if(stringBuffer.length() >= 1) stringBuffer.deleteCharAt(stringBuffer.length() - 1);
//				else{
//
//				}
			}
			if(e.getActionCommand().equals("C")){     // 清空上面的输入框
				// 清空 stringBuffer 要操作的表达式
//				stringBuffer.delete(0, stringBuffer.length());
				// 因为后面 stringBuffer 字符串还是从 textField_shang 的输入框得到的，所以得清空上面输入框的内容
//				textField_shang.setText("");    // 不能直接调用

//				disTextField_shang();    // 直接在 class 外面实现清空 textField_shang 的函数里面直接调用

				// 也可以放在里面来实现
				stringBuffer.delete(0, stringBuffer.length());
				textField_shang.setText("" + stringBuffer);
			}
			if(e.getActionCommand().equals("CE")){     // 清空下面的输出框
				String kong = "";
				textField_xia.setText("" + kong);
			}
			if(e.getActionCommand().equals("MC")){    // 把上下两个 TextField 都清空的
				String kong = "";
				textField_xia.setText("" + kong);
				// 下面会 textField_shang.setText("" + stringBuffer);  所以这里直接清空 stringBuffer 就可以了哦
				stringBuffer.delete(0, stringBuffer.length());
//				textField_shang.setText("" + kong);
			}
			if(e.getActionCommand().equals("MR")){    //  查看上一次计算表达式
				// 新开的面板不好关闭，会把用来的计算器也关闭了，就直接把数据 set 在输出框了哦

				if(len >= 2) textField_xia.setText("上一次计算表达式 ： " + stringBuffers[len - 2]);
				else  textField_xia.setText("上一次计算表达式没有，计算的次数太少了哦 ！！！");

//				Frame panel_stringBuffer = new Frame();
//				TextField textField_stringBuffer = new TextField();
//				textField_stringBuffer.setText("" + stringBuffers[len - 1]);
//				panel_stringBuffer.add(textField_stringBuffer);
//
//				panel_stringBuffer.setVisible(true);
//
//				panel_stringBuffer.addWindowListener(new WindowAdapter() {
//					@Override
//					public void windowClosing(WindowEvent e) {
//						System.exit(0);
//					}
//				});
//				panel_stringBuffer.setBounds(100,100,100,100);
////				panel_stringBuffer.pack();
////				panel_stringBuffer.setResizable(false);


			}
			if(e.getActionCommand().equals("MS")){    // 查看上一次计算字符串的结果
				// 新开的面板不好关闭，会把用来的计算器也关闭了，就直接把数据 set 在输出框了哦

				if(len >= 2) textField_xia.setText("上一次计算结果 ： " + double_ans[len - 2]);
				else  textField_xia.setText("上一次计算结果没有，计算的次数太少了哦 ！！！");

			}
			if(e.getActionCommand().equals("M+")){        // 冒一个框后 5 秒关闭计算器
				JOptionPane pane = new JOptionPane(JOptionPane.INFORMATION_MESSAGE);
				JDialog dialog = pane.createDialog(null, "内存添加");
				dialog.setModal(false);
				dialog.setVisible(true);


				new TimedExit();
			}
			if(e.getActionCommand().equals("M-")){    // 冒一个框后 5 秒关闭计算器
				JOptionPane pane = new JOptionPane(JOptionPane.INFORMATION_MESSAGE);
				JDialog dialog = pane.createDialog(null, "内存减少");
				dialog.setModal(false);
				dialog.setVisible(true);


				new TimedExit();
			}
			// +-    /-   功能不实现，在 special_Calculator 里面实现
//			if(e.getActionCommand().equals("++")){      //
//
//			}
//			if(e.getActionCommand().equals("--")) {     //
//
//			}







//			Stack nums = new Stack<Integer>();
//			Stack op = new Stack<String>();
//			Stack FuZu_num = new Stack<>();
//			String str_nums = "";
//			String str_op = "";
			if (e.getActionCommand().equals("==")) {
//				Stack<Integer> nums = new Stack<Integer>();
//				Stack<char> op = new Stack<char>();   // 两个栈实现计算的核心部件
//				Stack FuZu_num = new Stack<>();
				// 下面的大门是把 stringBuffer 里面的数字和操作符分别放进两个栈里面去（不需要）
//				for (int i = 0; i < stringBuffer.length(); i++) {
//					if (stringBuffer.charAt(i) <= '9' && stringBuffer.charAt(i) >= '0')
//						nums.add(stringBuffer.charAt(i) - '0');
//				}
//				for (int i = 0; i < stringBuffer.length(); i++) {
//					if (stringBuffer.charAt(i) > '9' || stringBuffer.charAt(i) < '0')
//						op.add(stringBuffer.charAt(i));
//				}
//
////				String ans = "";
//
//				while(nums.empty() == false){
//					FuZu_num.add(nums.peek());
//					nums.pop();
//				}
//				while(FuZu_num.empty() == false){
//					str_nums += FuZu_num.peek();
//					FuZu_num.pop();
//				}
//
//				while(op.empty() == false){
//					FuZu_num.add(op.peek());
//					op.pop();
//				}
//				while(FuZu_num.empty() == false){
//					str_op += FuZu_num.peek();
//					FuZu_num.pop();
//				}

//				exal();
//				get_ans();

//
//				String str_textField_shang = textField_shang.getText();
//				stringBuffer.delete(0, stringBuffer.length());
//				for(int i = 0; i < str_textField_shang.length(); i++)
//				stringBuffer.append(str_textField_shang.charAt(i));


//				Stack nums = new Stack<>();
//				Stack op = new Stack<>();
////				unordered_map<char, int> pr{{'+', 1}, {'-', 1}, {'x', 2}, {'/', 2}};
//				Map<String, Integer> pr = new HashMap<>();
//				pr.put("+", 1);
//				pr.put("-", 1);
//				pr.put("x", 2);
//				pr.put("/", 2);
//
//				for (int i = 0; i < stringBuffer.length(); i++) {
//					if (stringBuffer.charAt(i) <= '9' && stringBuffer.charAt(i) >= '0') {
//						int x = 0, j = i;
//						while (j < stringBuffer.length() && stringBuffer.charAt(j) <= '9' && stringBuffer.charAt(j) >= '0'){
//							x = x * 10 + (stringBuffer.charAt(j) - '0');
//							j++;
//						}
//						i = j - 1;
//						nums.push(x);
//					} else if (stringBuffer.charAt(i) == '(') {
//						op.push(stringBuffer.charAt(i));
//					} else if (stringBuffer.charAt(i) == ')') {
//						while (op.peek().equals('(') == false){
//							int b = (int) nums.peek();
//							nums.pop();
//							int a = (int) nums.peek();
//							nums.pop();
//							char c = (char) op.peek();
//							op.pop();
//
//							int x;
//							if(c == '+') x = a + b;
//							else if(c == '-') x = a - b;
//							else if(c == 'x') x = a * b;
//							else x = a / b;
//
//							nums.add(x);
//						}
//						op.pop();
//					} else {
//						while (op.empty() == false
//								&& op.peek().equals('(') == false   ///////
//								&& pr.get(op.peek()) >= pr.get(stringBuffer.charAt(i))){
//
//							int b = (int) nums.peek();
//							nums.pop();
//							int a = (int) nums.peek();
//							nums.pop();
//							char c = (char) op.peek();
//							op.pop();
//
//							int x;
//							if(c == '+') x = a + b;
//							else if(c == '-') x = a - b;
//							else if(c == 'x') x = a * b;
//							else x = a / b;
//
//							nums.add(x);
//						}
//						op.add(stringBuffer.charAt(i));
//					}
//				}
//
//				while (op.empty() == false){
//						int b = (int) nums.peek();
//						nums.pop();
//						int a = (int) nums.peek();
//						nums.pop();
//						char c = (char) op.peek();
//						op.pop();
//
//						int x;
//						if(c == '+') x = a + b;
//						else if(c == '-') x = a - b;
//						else if(c == 'x') x = a * b;
//						else x = a / b;
//
//						nums.add(x);
//				}

//				return (double)nums.peek();
				
				
//				textField_xia.setText("" + nums.peek());


				// 假设输入框输入的计算表达式都是有效的表达式
				String str_textField_shang = textField_shang.getText();
				// 判断输入框输入的要计算的字符串表达式是否有问题不好判断
////				str_textField_shang.length() == 1
//				if(str_textField_shang.length() == 1 && (str_textField_shang.charAt(0)  < '0' || str_textField_shang.charAt(0) > '9')){
//					textField_xia.setText("输入框输入错误，请重新输入 ！！！");
//					stringBuffer.delete(0, stringBuffer.length());
//					textField_shang.setText("" + stringBuffer);
//				}
////				str_textField_shang.length() == 2
//				if((str_textField_shang.charAt(0)  < '0' || str_textField_shang.charAt(0) > '9')
//				&& (str_textField_shang.charAt(1)  < '0' || str_textField_shang.charAt(1) > '9')){
//					textField_xia.setText("输入框输入错误，请重新输入 ！！！");
//					stringBuffer.delete(0, stringBuffer.length());
//					textField_shang.setText("" + stringBuffer);
//				}
//
////				str_textField_shang.length() >= 3
//				for (int i = 0; i < str_textField_shang.length(); i++)
//					if(i + 2 < str_textField_shang.length()
//					&& (str_textField_shang.charAt(i)  < '0' || str_textField_shang.charAt(i) > '9')
//					&& (str_textField_shang.charAt(i + 1)  < '0' || str_textField_shang.charAt(i + 1) > '9')
//					&& (str_textField_shang.charAt(i + 2)  < '0' || str_textField_shang.charAt(i + 2) > '9')){
//						// 相邻三个字符位置的字符都是 + - （ ） 的情况是不对的
//						// 相邻两个都是字符还正常，  1 + （ 2 + 3 ）
//
//						textField_xia.setText("输入框输入错误，请重新输入 ！！！");
//						stringBuffer.delete(0, stringBuffer.length());
//						textField_shang.setText("" + stringBuffer);
//					}

				stringBuffer.delete(0, stringBuffer.length());
				for(int i = 0; i < str_textField_shang.length(); i++)
					stringBuffer.append(str_textField_shang.charAt(i));

				double ans = getAns(stringBuffer);
				textField_xia.setText("" + ans);

				// 存储曾经计算过的表达式和结果
				stringBuffers[len] = textField_shang.getText();
				double_ans[len++] = ans;
				if(len == 101) System.exit(0);   // 如果存储的数据过多的话就直接关闭计算器的窗口


				// 不行
//				if(ans == 0.0){
//					textField_xia.setText("输入框输入错误，请重新输入 ！！！");
//					stringBuffer.delete(0, stringBuffer.length());
//					textField_shang.setText("" + stringBuffer);
//				}

//				nums.pop();

				stringBuffer.delete(0, stringBuffer.length());
//				System.out.println(stringBuffer);

//				System.out.println(op.size());
			}
			// 清空上面的输入框
			if(stringBuffer.length() <= 40) textField_shang.setText("" + stringBuffer);
			else if (stringBuffer.length() > 40)
				System.exit(0);

//			textField_shang.setText("");

		}



//		// 按钮 button_C 需要用到清空输入框的内容的功能的方法
//		public void disTextField_shang(){
//			textField_shang.setText("");    // 清空 textField_shang 里面的东西（上面的输入框还是有内容）
//
////			System.out.println(textField_shang.getText());
//
////			String str_textField_shang = textField_shang.getText();
//			stringBuffer.delete(0, stringBuffer.length());   // 下面的设置为空得加上一个空的字符串
//
//			textField_shang.setText("" + stringBuffer);    // 这个才是设置 textField_shang 为空（我们能看见的空）
//		}



		// 下面的代码不能直接在上面用函数去调用，就直接在上面展开了哦
//		public void eval(){
//			int b = (int) nums.peek();
//			nums.pop();
//			int a = (int) nums.peek();
//			nums.pop();
//			char c = (char) op.peek();
//			op.pop();
//
//			int x;
//			if(c == '+') x = a + b;
//			else if(c == '-') x = a - b;
//			else if(c == 'x') x = a * b;
//			else x = a / b;
//
//			nums.add(x);
//		}

		// 函数直接展开的方法也不行，还是在外面调用的方法比较好一点
		public double getAns(StringBuffer stringBuffer) {
			StringBuffer s = stringBuffer;

			//map来添加运算符号进去，定义优先级
			Map<Character,Double> map = new HashMap<>();
			map.put('+',1.0);
			map.put('-',1.0);
			map.put('x',2.0);
			map.put('/',2.0);

			Stack<Character> op = new Stack<>();//存运算符号
			Stack<Double> num = new Stack<>();//存数字

			for(int i = 0 ; i < s.length(); i ++ ){
				char c = s.charAt(i);
				//判断c字符是不是数字
				if(Character.isDigit(c)){
					Double x = 0.0;
					int j = i;
					//数字可能会是多位数，
					while(j < s.length() && Character.isDigit(s.charAt(j))){
						x = x * 10 + s.charAt(j) - '0';
						j++;
					}
					num.push(x);//将数字x存入数字栈栈顶
					i = j - 1;//重新赋值i
				}else if(c == '('){
					op.push(c); // 将左括号存入字符栈栈顶
				}else if(c == ')'){
					//如果栈顶不等于左括号，一直计算下去；
					while(op.peek() != '('){
						eval(op, num);
					}
					op.pop(); // 将左括号弹出栈顶
				}else { //如果是正常字符
					while(!op.empty() && op.peek() != '(' && map.get(op.peek()) >= map.get(c)){
						eval(op, num);
					}
					op.push(c);
				}
			}
			while(!op.empty()) eval(op, num);
//		System.out.println(num.peek());

			return num.peek();
		}

		public void eval(Stack<Character> op,Stack<Double> num){
			double b = num.pop();
			double a = num.pop();

			char c = op.pop();
			if(c == '+'){
				num.push(a + b);
			}else if(c == '-'){
				num.push(a - b);
			}else if(c == 'x'){
				num.push(a * b);
			}else {
				num.push(a / b);
			}
		}

	}
}




